package com.uraurora.crescent.util;

/**
 * @author : gaoxiaodong04
 * @program : crescent
 * @date : 2020-10-10 10:32
 * @description :
 */
public abstract class Distributions {

    public interface Distribution<V extends Comparable<? super V>>{
        /**
         * 广义加法
         * @param v1
         * @param v2
         * @return
         */
        V plus(V v1, V v2);

        /**
         * 广义减法
         * @param v1
         * @param v2
         * @return
         */
        V minus(V v1, V v2);

        /**
         * 广义乘法
         * @param v1
         * @param v2
         * @return
         */
        V times(V v1, V v2);

        /**
         * 广义除法
         * @param v1
         * @param v2
         * @return
         */
        V divide(V v1, V v2);

        /**
         * 最大值
         * @return
         */
        V maxValue();

        /**
         * 最小值
         * @return
         */
        V minValue();

        /**
         * 默认值，默认为最小值
         * @return
         */
        default V defaultValue(){
            return minValue();
        }
    }

    public static class DoubleDistribution implements Distribution<Double>{

        @Override
        public Double plus(Double v1, Double v2) {
            return v1 + v2;
        }

        @Override
        public Double minus(Double v1, Double v2) {
            return v1 - v2;
        }

        @Override
        public Double times(Double v1, Double v2) {
            return v1 * v2;
        }

        @Override
        public Double divide(Double v1, Double v2) {
            return v1 / v2;
        }

        @Override
        public Double maxValue() {
            return Double.MAX_VALUE;
        }

        @Override
        public Double minValue() {
            return 0.0;
        }
    }

    public static class IntegerDistribution implements Distribution<Integer>{
        @Override
        public Integer plus(Integer v1, Integer v2) {
            return v1+v2;
        }

        @Override
        public Integer minus(Integer v1, Integer v2) {
            return v1-v2;
        }

        @Override
        public Integer times(Integer v1, Integer v2) {
            return v1*v2;
        }

        @Override
        public Integer divide(Integer v1, Integer v2) {
            return v1/v2;
        }

        @Override
        public Integer maxValue() {
            return Integer.MAX_VALUE;
        }

        @Override
        public Integer minValue() {
            return 0;
        }
    }

    public static class LongDistribution implements Distribution<Long>{

        @Override
        public Long plus(Long v1, Long v2) {
            return v1 + v2;
        }

        @Override
        public Long minus(Long v1, Long v2) {
            return v1 - v2;
        }

        @Override
        public Long times(Long v1, Long v2) {
            return v1 * v2;
        }

        @Override
        public Long divide(Long v1, Long v2) {
            return v1 / v2;
        }

        @Override
        public Long maxValue() {
            return Long.MAX_VALUE;
        }

        @Override
        public Long minValue() {
            return 0L;
        }
    }

}
